package com.foo.designpattern.visitor;

import junit.framework.TestCase;

/**
 * com.foo.designpattern.visitor
 * Created with IntelliJ IDEA.
 * Created by jiang on 2016-05-16 15:35.
 *
 * @Description 测试类：访问者模式(Visitor)
 * <p/>
 * 访问者模式涉及到的角色如下：
 * 1、抽象访问者(Visitor)角色：声明了一个或者多个方法操作，形成所有的具体访问者角色必须实现的接口。
 * 2、具体访问者(Concrete Visitor)角色：实现抽象访问者所声明的接口，也就是抽象访问者所声明的各个访问操作。
 * 3、抽象节点(Node)角色：声明一个接受操作，接受一个访问者对象作为一个参数。
 * 4、具体节点(Concrete Node)角色：实现了抽象节点所规定的接受操作。
 * 5、结构对象(ObjectStructure)角色：有如下的责任，可以遍历结构中的所有元素。
 * <p/>
 * 访问者模式的优点：
 * 1、优良的扩展性：能够在不修改对象结构中的元素的情况下，为对象结构中的元素添加新的功能。
 * 2、好的复用性：可以通过访问者来定义整个对象结构通用的功能，从而提高复用程度。
 * 3、分离无关行为：可以通过访问者来分离无关的行为，把相关的行为封装在一起，构成一个访问者，这样每一个访问者的功能都比较单一。
 * <p/>
 * 访问者模式的缺点：
 * 1、对象结构变化很困难：不适用于对象结构中的类经常变化的情况。
 * 因为对象结构发生了改变，访问者的接口和访问者的实现都要发生相应的改变，代价太高。
 * 2、破坏封装：访问者模式通常需要对象结构开放内部数据给访问者和ObjectStructure，这破坏了对象的封装性。
 */

public class VisitorTestCase extends TestCase {
    public void testVisitor() {
        System.out.println("= = = = ↓↓↓访问者模式，测试开始↓↓↓ = = = =");
        // 创建一个结构对象
        ObjectStructure os = new ObjectStructure();
        // 给结构增加节点A
        os.add(new NodeA());
        // 给结构增加节点B
        os.add(new NodeB());
        // 创建一个访问者
        Visitor visitorA = new VisitorA();
        os.action(visitorA);
//        // 创建一个访问者
//        Visitor visitorB = new VisitorB();
//        os.action(visitorB);

        System.out.println("= = = = ↑↑↑访问者，测试结束↑↑↑ = = = =");
    }
}
